﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace QL_Nha_Sach_Phuong_Nam
{
    public partial class FormPhieuNhap : Form
    {
        //chuoi hanh dong
        string action;

        //bien tong tien
        float tongtien=0;

        //bien khoai ngoai toi phieu dat
        int FK_PhieuDat=0;

        //Kiem tra xem cbb da dc chon hay chua
        bool cbbtimtheonhaccselect = false;

        //Khai bao CXuly
        CXulyPhieuNhap XulyPhieuNhap;
        CXulyNhacungcap XulyNCC;
        CXulyPhieuDat XulyPhieuDat;
        CXulythongtinsach Xulysach;

        public FormPhieuNhap()
        {
            InitializeComponent();
        }

        private void FormPhieuNhap_Load(object sender, EventArgs e)
        {
            //khoi tao cac CXuly
            XulyPhieuNhap = new CXulyPhieuNhap();
            XulyPhieuDat = new CXulyPhieuDat();
            XulyNCC = new CXulyNhacungcap();
            Xulysach = new CXulythongtinsach();

            //do du lieu vao cbbtimtheonhacc
            cbbtimtheonhacc.DataSource = XulyNCC.GetdsNhaCungCap();
            cbbtimtheonhacc.DisplayMember = "NhaCungCapName";
            cbbtimtheonhacc.ValueMember = "NhaCungCapNo";

            //do du lieu vao cbbncc
            cbbncc.DataSource = XulyNCC.GetdsNhaCungCap();
            cbbncc.DisplayMember = "NhaCungCapName";
            cbbncc.ValueMember = "NhaCungCapNo";

            //load du lieu len from
            HienthidanhsachPhieuNhap(XulyPhieuNhap.getDsPhieuNhap());
        }

        private void btnthemphieunhap_Click(object sender, EventArgs e)
        {
            #region Xử lý giao diện
            btnthemphieunhap.Enabled = false;
            btnsuaphieunhap.Enabled = false;
            btnxoaphieunhap.Enabled = false;
            btnsavephieunhap.Enabled = true;
            btnHuy.Enabled = true;
            btnNhapKho.Enabled = false;

            gbchonnhacc.Visible = true;

            dgvchitietphieunhap.Rows.Clear();
            txtmaphieunhap.Text = "**New**";
            txtmotaphieunhap.Text = "";
            cbbncc.Text = "";

            dgvchitietphieunhap.Columns[5].Visible = true;
            #endregion

            #region Xử lý dữ liệu
            action = "add";
            #endregion

        }

        private void btnsuaphieunhap_Click(object sender, EventArgs e)
        {
            #region Xử lý giao diện
            btnthemphieunhap.Enabled = false;
            btnsuaphieunhap.Enabled = false;
            btnxoaphieunhap.Enabled = false;
            btnsavephieunhap.Enabled = true;
            btnHuy.Enabled = true;
            btnNhapKho.Enabled = false;

            gbchonnhacc.Visible = true;
            #endregion

            #region Xử lý dữ liệu
            action = "edit";
            #endregion
        }

        private void btnxoaphieunhap_Click(object sender, EventArgs e)
        {
            #region Xử lý giao diện
            btnthemphieunhap.Enabled = false;
            btnsuaphieunhap.Enabled = false;
            btnxoaphieunhap.Enabled = false;
            btnsavephieunhap.Enabled = true;
            btnHuy.Enabled = true;
            btnNhapKho.Enabled = false;

            gbchonnhacc.Visible = false;
            #endregion

            #region Xử lý dữ liệu
            action = "delete";
            #endregion
        }

        private void btnsavephieunhap_Click(object sender, EventArgs e)
        {
            #region Xử lý giao diện
            btnthemphieunhap.Enabled = true;
            btnsuaphieunhap.Enabled = true;
            btnxoaphieunhap.Enabled = false;
            btnsavephieunhap.Enabled = false;
            btnHuy.Enabled = false;

            gbchonnhacc.Visible = false;

            dgvchitietphieunhap.Columns[5].Visible = false;
            #endregion

            #region Xử lý dữ liệu
            switch (action)
            {
                case "add":
                    {
                        PhieuNhap pn = new PhieuNhap();
                        pn.PhieuNhapID = XulyPhieuNhap.getDsPhieuNhap().Count + 1;
                        pn.PhieuNhapNo = txtmaphieunhap.Text;
                        pn.PhieuNhapDate = dtpngaynhap.Value;
                        pn.PhieuNhapDescription = txtmotaphieunhap.Text;
                        pn.PhieuNhapStatus = "live";
                        pn.PhieuNhapHandle = "no";
                        pn.FK_NhaCungCapID=XulyNCC.TimNhacungcapma(cbbncc.SelectedValue.ToString()).NhaCungCapID;
                        pn.FK_PhieuDatID=FK_PhieuDat;
                        //duyet datagridview
                        foreach (DataGridViewRow r in dgvchitietphieunhap.Rows)
                        {
                            if (r.IsNewRow)
                                continue;
                            ChiTietPhieuNhap ctpn = new ChiTietPhieuNhap();
                            ctpn.FK_SachID = Xulysach.TimSachtheoma(r.Cells[0].Value.ToString()).SachID;
                            ctpn.ChiTietPhieuNhapQuantum = int.Parse(r.Cells[2].Value.ToString());
                            ctpn.ChiTietPhieuNhapPrice = float.Parse(r.Cells[3].Value.ToString());
                            ctpn.ChiTietPhieuNhapTotal = float.Parse(r.Cells[4].Value.ToString());
                            pn.ChiTietPhieuNhaps.Add(ctpn);
                        }

                        XulyPhieuNhap.ThemPhieuNhap(pn);

                        //Sửa lại trạng thái phiếu đặt thành đã xử lý
                        XulyPhieuDat.SuaTrangThaiPhieuDat(txtnhaptheo.Text);

                        //Cho phép nút nhập kho
                        btnNhapKho.Enabled = true;

                        #region Kiểm tra phiếu đặt đã hoàn thành hay chưa
                        if (KiemTraCompletePhieuDat() == true)// Nếu rồi set lại trạng thái complete
                        {
                            XulyPhieuDat.SuaCompletePhieuDat(txtnhaptheo.Text);
                        }
                        #endregion

                        break;
                    }
                case "edit":
                    {
                        PhieuNhap pn = new PhieuNhap();
                        pn.PhieuNhapID = XulyPhieuNhap.TimPhieuNhap(txtmaphieunhap.Text).PhieuNhapID;
                        pn.PhieuNhapNo = txtmaphieunhap.Text;
                        pn.PhieuNhapDate = dtpngaynhap.Value;
                        pn.PhieuNhapDescription = txtmotaphieunhap.Text;
                        pn.FK_NhaCungCapID = XulyNCC.TimNhacungcapma(cbbncc.SelectedValue.ToString()).NhaCungCapID;
                        pn.FK_PhieuDatID = XulyPhieuNhap.TimPhieuNhap(txtmaphieunhap.Text).PhieuDat.PhieuDatID;
                        foreach (DataGridViewRow r in dgvchitietphieunhap.Rows)
                        {
                            if (r.IsNewRow)
                                continue;
                            ChiTietPhieuNhap ctpn = new ChiTietPhieuNhap();
                            ctpn.FK_SachID = Xulysach.TimSachtheoma(r.Cells[0].Value.ToString()).SachID;
                            ctpn.ChiTietPhieuNhapQuantum = int.Parse(r.Cells[2].Value.ToString());
                            ctpn.ChiTietPhieuNhapPrice = float.Parse(r.Cells[3].Value.ToString());
                            ctpn.ChiTietPhieuNhapTotal = float.Parse(r.Cells[4].Value.ToString());
                            pn.ChiTietPhieuNhaps.Add(ctpn);
                        }

                        XulyPhieuNhap.SuaPhieuNhap(pn);

                        #region Kiểm tra phiếu đặt đã hoàn thành hay chưa
                        if (KiemTraCompletePhieuDat() == true)// Nếu rồi set lại trạng thái complete
                        {
                            XulyPhieuDat.SuaCompletePhieuDat(txtnhaptheo.Text);
                        }
                        #endregion
                        break;
                    }
                case "delete":
                    {
                        XulyPhieuNhap.XoaPhieuNhap(txtmaphieunhap.Text);
                        txtmaphieunhap.Text = "";
                        txtmotaphieunhap.Text = "";
                        break;
                    }
                default:
                    break;
            }
            #endregion
        }

        private void btnNhapKho_Click(object sender, EventArgs e)
        {
            if(txtmaphieunhap.Text=="")
            {
                MessageBox.Show("Ô mã phiếu nhập rỗng hoặc bạn vừa xóa đi nó dẫn đến tình trạng không nhập kho được!");
                return;
            }

            //1. Tiến hành Nhập Kho cho Phiếu nhập
            foreach (DataGridViewRow r in dgvchitietphieunhap.Rows)
            {
                if (r.IsNewRow)
                    continue;
                XulyPhieuNhap.NhapKho(1,Xulysach.TimSachtheoma(r.Cells[0].Value.ToString()).SachID,int.Parse(r.Cells[2].Value.ToString()));
            }

            //2. Sửa lại trạng thái phiếu nhập thành đã xử lý
            XulyPhieuNhap.SuaTrangThaiXuLyPhieuNhap(txtmaphieunhap.Text);

            btnNhapKho.Enabled = false;
        }

        private void cbbtimtheonhacc_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cbbtimtheonhaccselect == true)
            {
                NhaCungCap n=XulyNCC.TimNhacungcapma(cbbtimtheonhacc.SelectedValue.ToString());
                if (n.PhieuDats.Count > 0)
                {
                    cbbtimtheophieudat.DataSource = n.PhieuDats;
                    cbbtimtheophieudat.DisplayMember = "PhieuDatNo";
                    cbbtimtheophieudat.ValueMember = "PhieuDatNo";
                }
                else
                {
                    cbbtimtheophieudat.DataSource = null;
                    cbbtimtheophieudat.Text = null;
                }
            }
        }

        private void cbbtimtheonhacc_Enter(object sender, EventArgs e)
        {
            cbbtimtheonhaccselect = true;
        }

        private void btntim_Click(object sender, EventArgs e)
        {
            if (txttimtheomaphieunhap.Text != "")
            {
                var kq=XulyPhieuNhap.getDsPhieuNhap().Where(x=>x.PhieuNhapNo==txttimtheomaphieunhap.Text && x.PhieuNhapStatus=="live");
                if (kq!=null)
                {
                    HienthidanhsachPhieuNhap(kq.ToList<PhieuNhap>());
                }
                
            }
            else if(cbbtimtheophieudat.Text!="")
            {
                var kq = XulyPhieuNhap.getDsPhieuNhap().Where(x => x.PhieuDat.PhieuDatNo == cbbtimtheophieudat.SelectedValue.ToString() && x.PhieuNhapStatus == "live");
                if (kq != null)
                {
                    HienthidanhsachPhieuNhap(kq.ToList<PhieuNhap>());
                }
            }
        }

        private void btnchonphieudat_Click(object sender, EventArgs e)
        {
            dgvchitietphieunhap.Rows.Clear();
            Formchonphieudat f = new Formchonphieudat(XulyNCC.TimNhacungcapma(cbbncc.SelectedValue.ToString()));
            f.ShowDialog();

            PhieuDat pd = f.Pd;
            if (pd == null) return;
            
            var kq = from a in XulyPhieuNhap.getDsPhieuNhap()
                     from b in XulyPhieuNhap.getDSChiTietPhieuNhap()
                     where a.FK_PhieuDatID == pd.PhieuDatID && a.PhieuNhapID == b.FK_PhieuNhapID
                     group b by new { Ma = b.Sach.SachNo } into g
                     select new { MaHangHoa = g.Key.Ma, SoLuong = g.Sum(o => o.ChiTietPhieuNhapQuantum) };
            if (kq.Count() > 0)
            {
                int dem = 0;
                foreach (var item in kq)
                {
                    int i = dgvchitietphieunhap.Rows.Add();
                    dgvchitietphieunhap.Rows[i].Cells[0].Value = item.MaHangHoa;
                    dgvchitietphieunhap.Rows[i].Cells[1].Value = pd.ChiTietPhieuDats[dem].Sach.SachName;
                    dgvchitietphieunhap.Rows[i].Cells[5].Value = pd.ChiTietPhieuDats[dem].ChiTietPhieuDatQuantum - item.SoLuong;
                    dem++;
                }
                FK_PhieuDat = f.Pd.PhieuDatID;
            }

            else
            {
                foreach (ChiTietPhieuDat ctp in f.Pd.ChiTietPhieuDats)
                {
                    int i = dgvchitietphieunhap.Rows.Add();
                    dgvchitietphieunhap.Rows[i].Cells[0].Value = ctp.Sach.SachNo;
                    dgvchitietphieunhap.Rows[i].Cells[1].Value = ctp.Sach.SachName;
                    dgvchitietphieunhap.Rows[i].Cells[5].Value = ctp.ChiTietPhieuDatQuantum;
                }
                FK_PhieuDat = f.Pd.PhieuDatID;
            }

            txtnhaptheo.Text = pd.PhieuDatNo;
        }

        private void HienthidanhsachPhieuNhap(List<PhieuNhap> dspn)
        {
            lstphieunhap.Items.Clear();
            foreach(PhieuNhap pn in dspn)
            {
                ListViewItem lvi = lstphieunhap.Items.Add(pn.PhieuNhapNo);
                lvi.SubItems.Add(pn.PhieuNhapDate.ToString());
                lvi.SubItems.Add(pn.PhieuNhapDescription);
                lvi.SubItems.Add(pn.PhieuDat.PhieuDatNo);
                lvi.SubItems.Add(pn.NhaCungCap.NhaCungCapName);
            }
        }

        private void HienthiPhieuNhap(PhieuNhap pn)
        {
            #region Kiểm tra phiếu nhập đó đã nhập kho hay chưa, nếu đã nhập rồi thì không cho xóa, sửa và nhập lần nữa

            if (pn.PhieuNhapHandle=="yes")
            {
                btnsuaphieunhap.Enabled = false;
                btnxoaphieunhap.Enabled = false;
                btnNhapKho.Enabled = false;
            }
            else
            {
                btnsuaphieunhap.Enabled = true;
                btnxoaphieunhap.Enabled = true;
                btnNhapKho.Enabled = true;
            }

            #endregion
            txtmaphieunhap.Text = pn.PhieuNhapNo;
            dtpngaynhap.Value = pn.PhieuNhapDate.Value;
            txtnhaptheo.Text = pn.PhieuDat.PhieuDatNo;
            txtmotaphieunhap.Text = pn.PhieuNhapDescription;
            cbbncc.SelectedValue = pn.NhaCungCap.NhaCungCapNo;
            HienthiChitietPhieuNhap(pn.ChiTietPhieuNhaps.ToList<ChiTietPhieuNhap>());
        }

        private void HienthiChitietPhieuNhap(List<ChiTietPhieuNhap> dsctpn)
        {
            dgvchitietphieunhap.Rows.Clear();
            float tong = 0;
            foreach (ChiTietPhieuNhap ctpn in dsctpn)
            {
                int i = dgvchitietphieunhap.Rows.Add();
                dgvchitietphieunhap.Rows[i].Cells[0].Value = ctpn.Sach.SachNo;
                dgvchitietphieunhap.Rows[i].Cells[1].Value = ctpn.Sach.SachName;
                dgvchitietphieunhap.Rows[i].Cells[2].Value = ctpn.ChiTietPhieuNhapQuantum;
                dgvchitietphieunhap.Rows[i].Cells[3].Value = ctpn.ChiTietPhieuNhapPrice;
                dgvchitietphieunhap.Rows[i].Cells[4].Value = ctpn.ChiTietPhieuNhapTotal;
                tong += (float)ctpn.ChiTietPhieuNhapTotal;
            }
            txttongtienphieunhap.Text = tong.ToString();//hien tong tien
        }

        //Sự kiện khi rời khỏi 1 dòng trong row
        private void dgvchitietphieunhap_RowValidated(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex != dgvchitietphieunhap.RowCount - 1)
            {
                #region bắt lỗi ô số lượng, đơn gái không dc rỗng
                if (dgvchitietphieunhap.Rows[e.RowIndex].Cells[2].Value == null)
                {
                    MessageBox.Show("Phải nhập số lượng");
                    return;
                }
                if (dgvchitietphieunhap.Rows[e.RowIndex].Cells[3].Value == null)
                {
                    MessageBox.Show("Phải nhập đơn giá");
                    return;
                }
                #endregion
                if (dgvchitietphieunhap.Rows[e.RowIndex].Cells[5].Value != null)
                {
                    if (int.Parse(dgvchitietphieunhap.Rows[e.RowIndex].Cells[2].Value.ToString()) > int.Parse(dgvchitietphieunhap.Rows[e.RowIndex].Cells[5].Value.ToString()))
                    {
                        MessageBox.Show("Không được nhập lớn hơn số lượng cho phép");
                        dgvchitietphieunhap.Rows[e.RowIndex].Cells[2].Value = dgvchitietphieunhap.Rows[e.RowIndex].Cells[5].Value;
                        return;
                    }
                }
                int soluong = int.Parse(dgvchitietphieunhap.Rows[e.RowIndex].Cells[2].Value.ToString());
                float dongia = float.Parse(dgvchitietphieunhap.Rows[e.RowIndex].Cells[3].Value.ToString());
                float thanhtien = soluong * dongia;
                dgvchitietphieunhap.Rows[e.RowIndex].Cells[4].Value = thanhtien;
                tongtien += thanhtien;
                txttongtienphieunhap.Text = tongtien.ToString();// hien tong tien moi khi nhap so luong don gia.
            }
        }

        //Sự kiện khi chọn 1 phiếu nhập
        private void lstphieunhap_SelectedIndexChanged(object sender, EventArgs e)
        {
            foreach (ListViewItem lvi in lstphieunhap.SelectedItems)
            {
                string mapn = lvi.SubItems[0].Text;
                PhieuNhap pn = XulyPhieuNhap.TimPhieuNhap(mapn);
                HienthiPhieuNhap(pn);
            }

            tabControlPhieuNhap.SelectedIndex = 1;
        }

        private void btnHuy_Click(object sender, EventArgs e)
        {
            btnthemphieunhap.Enabled = true;
            btnsuaphieunhap.Enabled = true;
            btnxoaphieunhap.Enabled = false;
            btnsavephieunhap.Enabled = false;
            btnHuy.Enabled = false;
            if (action == "add")
            {
                txtmaphieunhap.Text = "";
                txtmotaphieunhap.Text = "";
                dgvchitietphieunhap.Rows.Clear();
                dgvchitietphieunhap.Columns[5].Visible = false;
            }
        }

        //Kiểm tra xem một phiếu đặt đã được nhập đủ số lượng hay chưa
        private bool KiemTraCompletePhieuDat()
        {
            bool kt = true;
            foreach (DataGridViewRow r in dgvchitietphieunhap.Rows)
            {
                if (r.IsNewRow)
                    continue;
                if (int.Parse(r.Cells[2].Value.ToString()) < int.Parse(r.Cells[5].Value.ToString()) || int.Parse(r.Cells[2].Value.ToString()) > int.Parse(r.Cells[5].Value.ToString()))
                {
                    kt=false;
                    break;
                }
            }
            return kt;
        }
    }
}
